package com.ssy.lingxi.common.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

/**
 * 压缩工具类
 * @author jw.chen
 * @version 2.0.0
 * @date 2021/1/14
 */
public class GzipUtils {
    /**
     * 压缩
     * @param value
     * @return
     * @throws Exception
     */
    public static byte[] gzip(String value) throws Exception {
        //我这里用字节流输出的，所以转正byte[]
        byte[] b = value.getBytes();
        //缓存数据用的字节数组流
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        //压缩用的是这个流
        GZIPOutputStream gout = new GZIPOutputStream(bout);
        gout.write(b);//把b写入到缓冲区中，也就是ByteArrayOutputStream
        gout.close();//关闭流，也就是把数据全都刷到字节数组流中
        b = bout.toByteArray();//这个字节数组流关闭之后还能用，不用担心，从他里面把压缩好的数据拿出来，还是放在byte[]中
        return b;
    }

    /**
     * 解压
     * @param b
     * @return
     * @throws Exception
     */
    public static String unGizp(byte[] b) throws Exception {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ByteArrayInputStream bis = new ByteArrayInputStream(b);
        GZIPInputStream gis =new GZIPInputStream(bis);
        int len = -1;
        byte [] b1 =new byte[1024];
        while((len = gis.read(b1)) != -1){
            bos.write(b1, 0, len);
        }
        bos.close();
        return bos.toString();
    }
}
